# ============================================================================
# Makefile for the Atari ST (cc68x) build
#
# This file should not be confused for the primary Makefile which is for gcc
# builds. Two seperate files are maintained because otherwise the gcc make
# would become very large and difficult to maintain.
#
# ============================================================================
# TODO: Update above documentation

# --- Variables and Configuration --------------------------------------------
# Folders
MODEL_FOLDER = model
RASTER_FOLDER = raster
RENDER_FOLDER = render
TESTS_FOLDER = tests
EVENTS_FOLDER = events
INPUT_FOLDER = input
PSG_FOLDER = psg
CLOCK_FOLDER = clock
SHARED_FOLDER = shared
SPLASH_SCREEN_FOLDER = splash
TESTS_MODEL_FOLDER = $(TESTS_FOLDER)\$(MODEL_FOLDER)
TESTS_RASTER_FOLDER = $(TESTS_FOLDER)\$(RASTER_FOLDER)
TESTS_RENDER_FOLDER = $(TESTS_FOLDER)\$(RENDER_FOLDER)
TESTS_EVENTS_FOLDER = $(TESTS_FOLDER)\$(EVENTS_FOLDER)
TESTS_INPUT_FOLDER = $(TESTS_FOLDER)\$(INPUT_FOLDER)
TESTS_PSG_FOLDER = $(TESTS_FOLDER)\$(PSG_FOLDER)
TESTS_CLOCK_FOLDER = $(TESTS_FOLDER)\$(CLOCK_FOLDER)
UNITY_FOLDER = $(TESTS_FOLDER)\unity

# File Names, Base - Events
ASYNC = async
COND = cond
SYNC = sync

# File names, Base - Clock
CLOCK = clock

# File Names, Base - Input
INPUT = input
IKBD = ikbd

# File Names, Base - PSG
PSG = psg
MUSIC = music

# PSG object group (PSG base object + music object)
PSG_OBJECTS = $(PSG).o $(MUSIC).o

# File Names, Base - Splash object group
SPLASH_OBJECTS = $(SPLASH).o

# File Names, Tests - PSG
TMUSIC = tmusic
EFFECTS = effects

# File Names, Base - Model
BLOCK  = block
SPIKE  = spike
LAVA   = lava
GEO    = geo
LEVEL  = level
WORLD  = world
MODEL  = model
MAIN   = dash
CAMERA = camera

# File Names, Base - Render
RENDER = render

# File Names, Base - Raster
CLR_SCN = clr_scn
CLR_REG = clr_reg
PLT_PXL = plt_pxl
PLT_HOR = plt_hor
PLT_VRT = plt_vrt
PLT_LIN = plt_lin
PLT_REC = plt_rec
PLT_SQR = plt_sqr
PLT_TRI = plt_tri
BMAP_8  = bmap_8
BMAP_16 = bmap_16
BMAP_32 = bmap_32
PLT_CHR = plt_chr
PLT_STR = plt_str
BOUNDS  = bounds
PLT_CLIP = plt_clp
GET_VID = get_vid
SET_VID = set_vid
RASTER = raster

# File Names, Base - Splash Screen
SPLASH = splash

# Global Variables
ATARI_CC     = cc68x
SHARED_FLAGS = -g

# Program Configuration
TOS_FLAGS      = $(SHARED_FLAGS) -c -I. -I$(MODEL_FOLDER) -I$(SHARED_FOLDER) -I$(RASTER_FOLDER) -I$(RENDER_FOLDER) -I$(EVENTS_FOLDER) -I$(INPUT_FOLDER) -I$(CLOCK_FOLDER) -I$(PSG_FOLDER) -I$(SPLASH_SCREEN_FOLDER)
MODEL_OBJECTS  = $(BLOCK).o $(SPIKE).o $(LAVA).o $(GEO).o $(LEVEL).o $(WORLD).o $(MODEL).o $(CAMERA).o $(MAIN).o
EVENTS_OBJECTS = $(ASYNC).o $(COND).o $(SYNC).o
CLOCK_OBJECTS = $(CLOCK).o
RASTER_OBJECTS = $(CLR_SCN).o $(CLR_REG).o $(PLT_PXL).o $(PLT_HOR).o $(PLT_VRT).o $(PLT_LIN).o $(PLT_REC).o $(PLT_SQR).o $(PLT_TRI).o $(BMAP_8).o $(BMAP_16).o $(BMAP_32).o $(PLT_CHR).o $(PLT_STR).o $(BOUNDS).o $(PLT_CLIP).o $(GET_VID).o $(SET_VID).o
RENDER_OBJECTS = $(RENDER).o
INPUT_OBJECTS  = $(INPUT).o $(IKBD).o
PSG_OBJECTS    = $(PSG).o $(EFFECTS).o $(MUSIC).o
TOS_OBJECTS    = $(MODEL_OBJECTS) $(RASTER_OBJECTS) $(RENDER_OBJECTS) $(EVENTS_OBJECTS) $(INPUT_OBJECTS) $(CLOCK_OBJECTS) $(PSG_OBJECTS) $(SPLASH_OBJECTS)

TOS_NAME       = dash.tos
# TODO: Feels redundant
MAIN_FLAGS     = $(SHARED_FLAGS) -I. -I$(MODEL_FOLDER) -I$(SHARED_FOLDER) -I$(RASTER_FOLDER) -I$(RENDER_FOLDER) -I$(EVENTS_FOLDER) -I$(INPUT_FOLDER) -I$(SPLASH_SCREEN_FOLDER)

# Test Configuration
# TODO: It's a bit silly, but pretty sure we're including all our .c files for each test.
TEST_FLAGS = $(SHARED_FLAGS) -I. -I$(MODEL_FOLDER) -I$(SHARED_FOLDER) -I$(RENDER_FOLDER) -I$(UNITY_FOLDER) -DUNITY_EXCLUDE_STDINT_H -DUNITY_INT_WIDTH=16 -DUNITY_LONG_WIDTH=32 -DUNITY_POINTER_WIDTH=32 -DTESTING
TEST_SRC   = $(MODEL_FOLDER)\$(BLOCK).c $(MODEL_FOLDER)\$(SPIKE).c $(MODEL_FOLDER)\$(LAVA).c $(MODEL_FOLDER)\$(GEO).c $(MODEL_FOLDER)\$(LEVEL).c $(MODEL_FOLDER)\$(WORLD).c $(MODEL_FOLDER)\$(MODEL).c $(MODEL_FOLDER)\$(CAMERA).c
UNITY      = $(UNITY_FOLDER)\unity.c

# Events Test Configuration
EVENTS_TEST_FLAGS = $(SHARED_FLAGS) -I. -I$(MODEL_FOLDER) -I$(SHARED_FOLDER) -I$(RENDER_FOLDER) -I$(EVENTS_FOLDER) -I$(UNITY_FOLDER) -DUNITY_EXCLUDE_STDINT_H -DUNITY_INT_WIDTH=16 -DUNITY_LONG_WIDTH=32 -DUNITY_POINTER_WIDTH=32 -DTESTING
EVENTS_TEST_SRC = $(TEST_SRC)

# Raster Test Configuration
RASTER_TEST_FLAGS = $(SHARED_FLAGS) -I. -I$(SHARED_FOLDER) -I$(RASTER_FOLDER) -I$(UNITY_FOLDER) -DUNITY_EXCLUDE_STDINT_H -DUNITY_INT_WIDTH=16 -DUNITY_LONG_WIDTH=32 -DUNITY_POINTER_WIDTH=32 -DTESTING

# Clock Test Configuration
CLOCK_TEST_FLAGS = $(SHARED_FLAGS) -I. -I$(CLOCK_FOLDER) -I$(UNITY_FOLDER) -DUNITY_EXCLUDE_STDINT_H -DUNITY_INT_WIDTH=16 -DUNITY_LONG_WIDTH=32 -DUNITY_POINTER_WIDTH=32 -DTESTING

# Render Test Configuration
RENDER_TEST_FLAGS = $(SHARED_FLAGS) -I. -I$(MODEL_FOLDER) -I$(SHARED_FOLDER) -I$(RENDER_FOLDER) -I$(UNITY_FOLDER) -DUNITY_EXCLUDE_STDINT_H -DUNITY_INT_WIDTH=16 -DUNITY_LONG_WIDTH=32 -DUNITY_POINTER_WIDTH=32 -DTESTING
RENDER_TEST_SRC = $(TEST_SRC) $(RENDER_FOLDER)\$(RENDER).c

# File Names, Tests - Events
TASYNC = t${ASYNC}
TCOND = t${COND}
TSYNC = t${SYNC}

# File Names, Tests - Input
TINPUT = t${INPUT}
TIKBD = t${IKBD}

# File Names, Tests - PSG
TPSG = t${PSG}

# File Names, Tests - Model
TBLOCK = t${BLOCK}
TGEO   = t${GEO}
TLAVA  = t${LAVA}
TLEVEL = t${LEVEL}
TSPIKE = t${SPIKE}
TWORLD = t${WORLD}
TMODEL = t${MODEL}
TCAMERA = t${CAMERA}

# File Names, Tests - Render
TRENDER = t${RENDER}

# File Names, Tests - Raster
TCLR_SCN = t${CLR_SCN}
TCLR_REG = t${CLR_REG}
TPLT_PXL = t${PLT_PXL}
TPLT_HOR = t${PLT_HOR}
TPLT_VRT = t${PLT_VRT}
TPLT_LIN = t${PLT_LIN}
TPLT_REC = t${PLT_REC}
TPLT_SQR = t${PLT_SQR}
TPLT_TRI = t${PLT_TRI}
TBMAP_8  = t${BMAP_8}
TBMAP_16 = t${BMAP_16}
TBMAP_32 = t${BMAP_32}
TPLT_CHR = t${PLT_CHR}
TPLT_STR = t${PLT_STR}
TBOUNDS  = t${BOUNDS}
TPLT_CLIP = t${PLT_CLIP}
TGET_VID = tget_vid
TSET_VID = tset_vid

# File Names, Tests - Clock
TCLOCK = t${CLOCK}

# ----- Program Builds -------------------------------------------------------
$(TOS_NAME): $(TOS_OBJECTS)
	$(ATARI_CC) $(MAIN_FLAGS) $(TOS_OBJECTS) -o $(TOS_NAME)

$(CAMERA).o: $(MODEL_FOLDER)\$(CAMERA).c $(MODEL_FOLDER)\$(CAMERA).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(CAMERA).c -o $(CAMERA).o

$(BLOCK).o: $(MODEL_FOLDER)\$(BLOCK).c $(MODEL_FOLDER)\$(BLOCK).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(BLOCK).c -o $(BLOCK).o

$(LAVA).o: $(MODEL_FOLDER)\$(LAVA).c $(MODEL_FOLDER)\$(LAVA).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(LAVA).c -o $(LAVA).o

$(SPIKE).o: $(MODEL_FOLDER)\$(SPIKE).c $(MODEL_FOLDER)\$(SPIKE).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(SPIKE).c -o $(SPIKE).o

$(GEO).o: $(MODEL_FOLDER)\$(GEO).c $(MODEL_FOLDER)\$(GEO).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(GEO).c -o $(GEO).o

$(LEVEL).o: $(MODEL_FOLDER)\$(LEVEL).c $(MODEL_FOLDER)\$(LEVEL).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(LEVEL).c -o $(LEVEL).o

$(WORLD).o: $(MODEL_FOLDER)\$(WORLD).c $(MODEL_FOLDER)\$(WORLD).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(WORLD).c -o $(WORLD).o

$(MODEL).o: $(MODEL_FOLDER)\$(MODEL).c $(MODEL_FOLDER)\$(MODEL).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(MODEL_FOLDER)\$(MODEL).c -o $(MODEL).o

$(MAIN).o: $(MAIN).c $(MODEL_FOLDER)\$(MODEL).h $(SHARED_FOLDER)\dtypes.h $(RASTER_FOLDER)\$(RASTER).h $(CLOCK_FOLDER)\$(CLOCK).h $(INPUT_FOLDER)\$(INPUT).h $(PSG_FOLDER)\$(EFFECTS).h
	$(ATARI_CC) $(TOS_FLAGS) $(MAIN).c -o $(MAIN).o

$(ASYNC).o: $(EVENTS_FOLDER)\$(ASYNC).c $(EVENTS_FOLDER)\$(ASYNC).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(EVENTS_FOLDER)\$(ASYNC).c -o $(ASYNC).o

$(COND).o: $(EVENTS_FOLDER)\$(COND).c $(EVENTS_FOLDER)\$(COND).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(EVENTS_FOLDER)\$(COND).c -o $(COND).o

$(SYNC).o: $(EVENTS_FOLDER)\$(SYNC).c $(EVENTS_FOLDER)\$(SYNC).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(EVENTS_FOLDER)\$(SYNC).c -o $(SYNC).o

$(INPUT).o: $(INPUT_FOLDER)\$(INPUT).c $(INPUT_FOLDER)\$(INPUT).h $(INPUT_FOLDER)\$(IKBD).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(INPUT_FOLDER)\$(INPUT).c -o $(INPUT).o

$(IKBD).o: $(INPUT_FOLDER)\$(IKBD).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(INPUT_FOLDER)\$(IKBD).s -o $(IKBD).o

$(PSG).o: $(PSG_FOLDER)\$(PSG).c $(PSG_FOLDER)\$(PSG).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(PSG_FOLDER)\$(PSG).c -o $(PSG).o

$(MUSIC).o: $(PSG_FOLDER)\$(MUSIC).c $(PSG_FOLDER)\$(MUSIC).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(PSG_FOLDER)\$(MUSIC).c -o $(MUSIC).o

$(EFFECTS).o: $(PSG_FOLDER)\$(EFFECTS).c $(PSG_FOLDER)\$(EFFECTS).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(PSG_FOLDER)\$(EFFECTS).c -o $(EFFECTS).o

$(RENDER).o: $(RENDER_FOLDER)\$(RENDER).c $(RENDER_FOLDER)\$(RENDER).h $(SHARED_FOLDER)\dtypes.h $(RASTER_FOLDER)\$(RASTER).h
	$(ATARI_CC) $(TOS_FLAGS) $(RENDER_FOLDER)\$(RENDER).c -o $(RENDER).o

$(CLOCK).o: $(CLOCK_FOLDER)\$(CLOCK).c $(CLOCK_FOLDER)\$(CLOCK).h
	$(ATARI_CC) $(TOS_FLAGS) $(CLOCK_FOLDER)\$(CLOCK).c -o $(CLOCK).o

$(SPLASH).o: $(SPLASH_SCREEN_FOLDER)\$(SPLASH).c $(SPLASH_SCREEN_FOLDER)\$(SPLASH).h $(SHARED_FOLDER)\dtypes.h
	$(ATARI_CC) $(TOS_FLAGS) $(SPLASH_SCREEN_FOLDER)\$(SPLASH).c -o $(SPLASH).o

$(CLR_SCN).o: $(RASTER_FOLDER)\$(CLR_SCN).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(CLR_SCN).s -o $(CLR_SCN).o


# ----- Test Builds ----------------------------------------------------------
$(TBLOCK): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TBLOCK).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TBLOCK).ut

$(TGEO): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TGEO).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TGEO).ut

$(TLAVA): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TLAVA).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TLAVA).ut

$(TLEVEL): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TLEVEL).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TLEVEL).ut

$(TSPIKE): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TSPIKE).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TSPIKE).ut

$(TWORLD): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TWORLD).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TWORLD).ut

$(TMODEL): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TMODEL).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TMODEL).ut

$(TCAMERA): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(TEST_FLAGS) $(TESTS_MODEL_FOLDER)\$(TCAMERA).c $(TEST_SRC) $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TCAMERA).ut


# ----- Render Test Builds ---------------------------------------------------
# Include clear-screen object so render.o's reference to _clear_screen is satisfied
$(TRENDER): $(PLT_REC).o $(BMAP_32).o $(BOUNDS).o $(PLT_CLIP).o $(CLR_REG).o $(CLR_SCN).o $(GET_VID).o $(SET_VID).o $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(RENDER_TEST_FLAGS) $(TESTS_RENDER_FOLDER)\$(TRENDER).c $(RENDER_TEST_SRC) $(PLT_REC).o $(BMAP_32).o $(BOUNDS).o $(PLT_CLIP).o $(CLR_REG).o $(CLR_SCN).o $(GET_VID).o $(SET_VID).o $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TRENDER).ut


# ----- Events Test Builds ---------------------------------------------------
$(TASYNC): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(EVENTS_TEST_FLAGS) $(TESTS_EVENTS_FOLDER)\$(TASYNC).c $(EVENTS_TEST_SRC) $(EVENTS_FOLDER)\$(ASYNC).c $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TASYNC).ut

$(TCOND): $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(EVENTS_TEST_FLAGS) $(TESTS_EVENTS_FOLDER)\$(TCOND).c $(EVENTS_TEST_SRC) $(EVENTS_FOLDER)\$(COND).c $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TCOND).ut

$(TSYNC): $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(EVENTS_TEST_FLAGS) $(TESTS_EVENTS_FOLDER)\$(TSYNC).c $(EVENTS_TEST_SRC) $(EVENTS_FOLDER)\$(SYNC).c $(COND).o $(EFFECTS).o $(MUSIC).o $(PSG).o $(CLOCK).o $(UNITY) -o $(TSYNC).ut


# ----- Input Test Builds ----------------------------------------------------
$(TINPUT): $(INPUT).o $(IKBD).o
	$(ATARI_CC) $(MAIN_FLAGS) $(TESTS_INPUT_FOLDER)\$(TINPUT).c $(INPUT).o $(IKBD).o -o $(TINPUT).tos

$(TIKBD): $(INPUT).o $(IKBD).o
	$(ATARI_CC) $(MAIN_FLAGS) $(TESTS_INPUT_FOLDER)\$(TIKBD).c $(INPUT).o $(IKBD).o -o $(TIKBD).tos


# ----- PSG Test Builds ------------------------------------------------------
$(TPSG): $(PSG).o $(CLOCK).o
	$(ATARI_CC) $(MAIN_FLAGS) $(TESTS_PSG_FOLDER)\$(TPSG).c $(PSG).o $(CLOCK).o -o $(TPSG).tos

$(TMUSIC): $(PSG).o $(MUSIC).o $(CLOCK).o
	$(ATARI_CC) $(MAIN_FLAGS) $(TESTS_PSG_FOLDER)\$(TMUSIC).c $(PSG).o $(MUSIC).o $(CLOCK).o -o $(TMUSIC).tos


# TODO: For some of these, there is cascading dependencies on objects, eg chr
# ----- Raster Test Builds ---------------------------------------------------
$(TCLR_SCN): $(CLR_SCN).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TCLR_SCN).c $(CLR_SCN).o $(UNITY) -o $(TCLR_SCN).ut

$(TCLR_REG): $(CLR_REG).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TCLR_REG).c $(CLR_REG).o $(UNITY) -o $(TCLR_REG).ut

$(TPLT_PXL): $(PLT_PXL).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_PXL).c $(PLT_PXL).o $(UNITY) -o $(TPLT_PXL).ut

$(TPLT_HOR): $(PLT_HOR).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_HOR).c $(PLT_HOR).o $(UNITY) -o $(TPLT_HOR).ut

$(TPLT_VRT): $(PLT_VRT).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_VRT).c $(PLT_VRT).o $(UNITY) -o $(TPLT_VRT).ut

$(TPLT_LIN): $(PLT_LIN).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_LIN).c $(PLT_LIN).o $(UNITY) -o $(TPLT_LIN).ut

$(TPLT_REC): $(PLT_REC).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_REC).c $(PLT_REC).o $(UNITY) -o $(TPLT_REC).ut

$(TPLT_SQR): $(PLT_SQR).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_SQR).c $(PLT_SQR).o $(UNITY) -o $(TPLT_SQR).ut

$(TPLT_TRI): $(PLT_TRI).o $(PLT_HOR).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_TRI).c $(PLT_TRI).o $(PLT_HOR).o $(UNITY) -o $(TPLT_TRI).ut

$(TBMAP_8): $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TBMAP_8).c $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o $(UNITY) -o $(TBMAP_8).ut

$(TBMAP_16): $(BMAP_16).o $(BOUNDS).o $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TBMAP_16).c $(BMAP_16).o $(BOUNDS).o $(PLT_CLIP).o $(UNITY) -o $(TBMAP_16).ut

$(TBMAP_32): $(BMAP_32).o $(BOUNDS).o $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TBMAP_32).c $(BMAP_32).o $(BOUNDS).o $(PLT_CLIP).o $(UNITY) -o $(TBMAP_32).ut

$(TPLT_CHR): $(PLT_CHR).o $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_CHR).c $(PLT_CHR).o $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o $(UNITY) -o $(TPLT_CHR).ut

$(TPLT_STR): $(PLT_STR).o $(PLT_CHR).o $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_STR).c $(PLT_STR).o $(PLT_CHR).o $(BMAP_8).o $(BOUNDS).o $(PLT_CLIP).o $(UNITY) -o $(TPLT_STR).ut

$(TBOUNDS): $(BOUNDS).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TBOUNDS).c $(BOUNDS).o $(UNITY) -o $(TBOUNDS).ut

$(TPLT_CLIP): $(PLT_CLIP).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TPLT_CLIP).c $(PLT_CLIP).o $(UNITY) -o $(TPLT_CLIP).ut

$(TGET_VID): $(TESTS_RASTER_FOLDER)\$(TGET_VID).c $(GET_VID).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TGET_VID).c $(GET_VID).o $(UNITY) -o $(TGET_VID).ut

$(TSET_VID): $(TESTS_RASTER_FOLDER)\$(TSET_VID).c $(SET_VID).o $(GET_VID).o
	$(ATARI_CC) $(RASTER_TEST_FLAGS) $(TESTS_RASTER_FOLDER)\$(TSET_VID).c $(SET_VID).o $(GET_VID).o $(UNITY) -o $(TSET_VID).ut


# ----- Clock Test Builds ---------------------------------------------------
$(TCLOCK): $(CLOCK).o
	$(ATARI_CC) $(CLOCK_TEST_FLAGS) $(TESTS_CLOCK_FOLDER)\$(TCLOCK).c $(CLOCK).o $(UNITY) -o $(TCLOCK).ut


# ----- Test Execution -------------------------------------------------------
test: $(TINPUT) $(TIKBD) $(TPSG) $(TMUSIC) $(TBLOCK) $(TGEO) $(TLAVA) $(TLEVEL) $(TSPIKE) $(TWORLD) $(TMODEL) $(TCAMERA) $(TRENDER) $(TASYNC) $(TCOND) $(TSYNC) $(TCLR_SCN) $(TCLR_REG) $(TPLT_PXL) $(TPLT_HOR) $(TPLT_VRT) $(TPLT_LIN) $(TPLT_REC) $(TPLT_SQR) $(TPLT_TRI) $(TBMAP_8) $(TBMAP_16) $(TBMAP_32) $(TPLT_CHR) $(TPLT_STR) $(TBOUNDS) $(TPLT_CLIP) $(TGET_VID) $(TSET_VID)
	$(TBLOCK).ut
	$(TGEO).ut
	$(TLAVA).ut
	$(TLEVEL).ut
	$(TSPIKE).ut
	$(TWORLD).ut
	$(TMODEL).ut
	$(TCAMERA).ut
	$(TASYNC).ut
	$(TCOND).ut
	$(TSYNC).ut
	$(TCLR_SCN).ut
	$(TCLR_REG).ut
	$(TPLT_PXL).ut
	$(TPLT_HOR).ut
	$(TPLT_VRT).ut
	$(TPLT_LIN).ut
	$(TPLT_REC).ut
	$(TPLT_SQR).ut
	$(TPLT_TRI).ut
	$(TBMAP_8).ut
	$(TBMAP_16).ut
	$(TBMAP_32).ut
	$(TPLT_CHR).ut
	$(TPLT_STR).ut
	$(TBOUNDS).ut
	$(TPLT_CLIP).ut
	$(TGET_VID).ut
	$(TSET_VID).ut
	$(TMUSIC).tos


# ----- Raster Library Builds ------------------------------------------------
$(CLR_REG).o: $(RASTER_FOLDER)\$(CLR_REG).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(CLR_REG).s -o $(CLR_REG).o

$(PLT_PXL).o: $(RASTER_FOLDER)\$(PLT_PXL).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_PXL).s -o $(PLT_PXL).o

$(PLT_HOR).o: $(RASTER_FOLDER)\$(PLT_HOR).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_HOR).s -o $(PLT_HOR).o

$(PLT_VRT).o: $(RASTER_FOLDER)\$(PLT_VRT).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_VRT).s -o $(PLT_VRT).o

$(PLT_LIN).o: $(RASTER_FOLDER)\$(PLT_LIN).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_LIN).s -o $(PLT_LIN).o

$(PLT_REC).o: $(RASTER_FOLDER)\$(PLT_REC).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_REC).s -o $(PLT_REC).o

$(PLT_SQR).o: $(RASTER_FOLDER)\$(PLT_SQR).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_SQR).s -o $(PLT_SQR).o

$(PLT_TRI).o: $(RASTER_FOLDER)\$(PLT_TRI).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_TRI).s -o $(PLT_TRI).o

$(BMAP_8).o: $(RASTER_FOLDER)\$(BMAP_8).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(BMAP_8).s -o $(BMAP_8).o

$(BMAP_16).o: $(RASTER_FOLDER)\$(BMAP_16).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(BMAP_16).s -o $(BMAP_16).o

$(BMAP_32).o: $(RASTER_FOLDER)\$(BMAP_32).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(BMAP_32).s -o $(BMAP_32).o

$(PLT_CHR).o: $(RASTER_FOLDER)\$(PLT_CHR).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_CHR).s -o $(PLT_CHR).o

$(PLT_STR).o: $(RASTER_FOLDER)\$(PLT_STR).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_STR).s -o $(PLT_STR).o

$(BOUNDS).o: $(RASTER_FOLDER)\$(BOUNDS).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(BOUNDS).s -o $(BOUNDS).o

$(PLT_CLIP).o: $(RASTER_FOLDER)\$(PLT_CLIP).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(PLT_CLIP).s -o $(PLT_CLIP).o

$(GET_VID).o: $(RASTER_FOLDER)\$(GET_VID).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(GET_VID).s -o $(GET_VID).o

$(SET_VID).o: $(RASTER_FOLDER)\$(SET_VID).s
	$(ATARI_CC) $(SHARED_FLAGS) -c $(RASTER_FOLDER)\$(SET_VID).s -o $(SET_VID).o

# ----- Output ---------------------------------------------------------------
# Otherwise the Make can think that the commands are files.
.PHONY: test $(TINPUT) $(TIKBD) $(TPSG) $(TBLOCK) $(TGEO) $(TLAVA) $(TLEVEL) $(TSPIKE) $(TWORLD) $(TMODEL) $(TCAMERA) $(TRENDER) $(TASYNC) $(TCOND) $(TSYNC) $(TCLR_SCN) $(TCLR_REG) $(TPLT_PXL) $(TPLT_HOR) $(TPLT_VRT) $(TPLT_LIN) $(TPLT_REC) $(TPLT_SQR) $(TPLT_TRI) $(TBMAP_8) $(TBMAP_16) $(TBMAP_32) $(TPLT_CHR) $(TPLT_STR) $(TBOUNDS) $(TPLT_CLIP) $(TGET_VID) $(TSET_VID) $(TMUSIC)
